// * 【反引号，允许字符串跨行】
let str = `这是一行字符串
这是第二行字符串`
console.log(str)

// * 【常规字符串使用 \n 进行换行】
let str2 = '这是一行字符串\n这是第二行字符串'
console.log(str2)

// * 【字符串长度】
let str3 = '这是一行字符串'
console.log(str3.length) // 7

// * 【根据 [index] 或 str.charAt(pos) 获取字符】
let str4 = `hello`
console.log(str4[0]) // h
console.log(str4.charAt(0)) // h
console.log(str4[[str4.length - 1]]) // o

// * 【for...of遍历字符】
for (const char of 'STRING') {
	console.log(char) // S T R I N G
}

// * 【字符串不可更改】
let str5 = 'la'
str5[0] = 'L' // 无效
console.log(str5) // la

// 直接替换其值
str5 = 'La'

// * 【改变大小写】
console.log('Interface'.toLocaleLowerCase()) // interface
console.log('Interface'.toLocaleUpperCase()) // INTERFACE;

// * 【查找子字符串】
// 语法：str.indexOf(substr, pos) 从指定字符串开始查找，找到返回出现的位置，没找到返回 -1。
let str6 = 'width is 100 is width'
console.log(str6.indexOf('width')) // 0 从位置0开始就匹配到了这个字符
console.log(str6.indexOf('is')) // 6 从位置6开始就匹配到了这个字符
console.log(str6.indexOf('100')) // 9 从位置9开始就匹配到了这个字符
console.log(str6.indexOf('Width')) // -1 没有匹配到，返回-1

// 从指定索引开始往后查找
console.log(str6.indexOf('is', 12)) // 13

// * 【按位运算】
console.log(~-1) // 0 相当于 -(-1 + 1)
console.log(~0) // -1 相当于 -(0 + 1)
console.log(~2) // -3 相当于 -(2 + 1)

// * 【现代方法 includes startsWith endsWith 】
// includes 判断字符串是否包含子字符串 存在返回 true，不存在返回 false
console.log('hello world'.includes('world')) // true
console.log('hello world'.includes('Hello')) // false
console.log('hello world hello'.includes('hello', 11)) // true 从指定索引 11 开始查找

// startsWith 判断字符串是否以子字符串开头 存在返回 true，不存在返回 false
console.log('wyn'.startsWith('w')) // true
console.log('wyn'.startsWith('y')) // false
console.log('wyn'.startsWith('w', 0)) // true 从指定索引 1 开始查找

// endsWith 判断字符串是否以子字符串结尾 存在返回 true，不存在返回 false
console.log('img.png'.endsWith('.png')) // true
console.log('wyn'.endsWith('y')) // false
console.log('wyn'.endsWith('n')) // true

// * 【slice 截取字符串】
// str.slice(start[, end]) 截取指定范围的字符串，但不包括 end。
let str7 = 'helloWorld'
console.log(str7.slice(0, 5)) // hello
console.log(str7.slice(5)) // World
console.log(str7.slice(-4, -1)) // orl

// * 【比较字符串】

// 1 - str.codePointAt(pos) 返回在 pos 位置的字符代码（Unicode 代码点），超出索引范围返回 undefined。

let str8 = 'Hello, World!'
// 获取字符串中各个位置字符的 Unicode 代码点
console.log(str8.codePointAt(0)) // 'H' 的 Unicode 代码点: 72
console.log(str8.codePointAt(1)) // 'e' 的 Unicode 代码点: 101
console.log(str8.codePointAt(2)) // 'l' 的 Unicode 代码点: 108
console.log(str8.codePointAt(3)) // 'l' 的 Unicode 代码点: 108
console.log(str8.codePointAt(4)) // 'o' 的 Unicode 代码点: 111
console.log(str8.codePointAt(7)) // 'W' 的 Unicode 代码点: 87
// 获取最后一个字符的 Unicode 代码点
console.log(str8.codePointAt(str8.length - 1)) // '!' 的 Unicode 代码点: 33

// 2 - String.fromCodePoint(code) 通过数字 code 创建字符，代码为 65..220 的字符（拉丁字母和一些额外的字符）。
let str9 = ''

for (let i = 65; i <= 220; i++) {
	str9 += String.fromCodePoint(i)
}

console.log(str9)
// 打印结果：ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜ

// * 【字符串正确的比较】

// 使用 str.localeCompare(str2) 返回一个整数，这个整数能指示字符串 str 在 str2 之前，之后或相等。
// 通过字母的代码比较字母。对于许多字母，最好使用 str.localeCompare 方法正确地对字母进行排序。
// 规则：
// 1.如果 str 在 str2 前面 返回 -1
// 2.如果 str 在 str2 后面 返回 1
// 3.如果 str 等于 str2 返回 0

console.log('a'.localeCompare('b')) // -1
console.log('b'.localeCompare('a')) // 1
console.log('b'.localeCompare('b')) // 0
